<?php

require_once dirname(__FILE__).'/../lib/ins_stageGeneratorConfiguration.class.php';
require_once dirname(__FILE__).'/../lib/ins_stageGeneratorHelper.class.php';

/**
 * ins_stage actions.
 *
 * @package    tfe
 * @subpackage ins_stage
 * @author     Derboven Jerome
 * @version    SVN: $Id: actions.class.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class ins_stageActions extends autoIns_stageActions {

    public function executeNew(sfWebRequest $request) {
        $id = $request->getParameter('id');
        if($id) {
            $ins = new InsStage();
            $ins->setIdContact($request->getParameter('id'));
            $this->form = new InsStageForm($ins);
        }else {
            $this->form = $this->configuration->getForm();
        }
        $this->ins_stage = $this->form->getObject();
    }

    protected function processForm(sfWebRequest $request, sfForm $form) {
        // recuperer le formulaire ['ins_stage']
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));

        if ($form->getObject()->isNew()) {
            // variable contenant une valeur si contact ou groupe deja inscrit
            $insExistant = null;

            // recuperer les inscriptions existantes
            // si le user a defini une inscription pour un contact
            // si pas, on checke si le user n'a pas defini une inscription pour un groupe
            if (!is_null($form->getValue('id_contact'))) {
                $insExistant = $this->contactInscrit($form->getValue('id_contact'), $form->getValue('id_stage'));
            } else if (!is_null($form->getValue('id_groupe'))) {
                $insExistant = $this->groupeInscrit($form->getValue('id_groupe'), $form->getValue('id_stage'));
            } else {
                throw new Exception();
            }

            // test sur les inscriptions existantes
            if (!is_null($insExistant)) {
                if (0 == count($insExistant)) {
                    // compter les inscriptions (groupe / contact) pour ce stage
                    $nbInscriptions = $this->determinerNbIns($form->getValue('id_groupe'));

                    // recuperer le stage depuis l'id entre sur le formulaire
                    $stage = Doctrine_Core::getTable('Stage')->find($form->getValue('id_stage'));

                    // obtenir le nombre de personnes max definies au niveau du stage
                    // champ non mandatory donc il faut tester si ce chiffre ...
                    // ... a ete specifie lors de la creation du stage
                    $nbMaxPersonnes = $stage->getNbrPersonnesMax();
                    if (!is_null($nbMaxPersonnes) && !empty($nbMaxPersonnes)) {
                        $nbInscriptions = $this->compterInscription($nbInscriptions, $stage->getInscriptions());
                        $nbMaxPersonnes = intval($nbMaxPersonnes); // par defaut, nbMaxPersonnes = String
                    } else {
                        $nbMaxPersonnes = 9999;
                    }

                    // si le nb d'inscriptions [actuel] est <= au nb max alors on accepte l'inscription
                    if($nbInscriptions <= $nbMaxPersonnes) {
                        // le code qui suit est la méthode initiale générée
                        if ($form->isValid()) {
                            $notice = $form->getObject()->isNew() ? 'The item was created successfully.' : 'The item was updated successfully.';
                            $ins_stage = $form->save();
                            $this->dispatcher->notify(new sfEvent($this, 'admin.save_object', array('object' => $ins_stage)));

                            if ($request->hasParameter('_save_and_add')) {
                                $this->getUser()->setFlash('notice', $notice.' You can add another one below.');
                                $this->redirect('@ins_stage_new');
                            } else {
                                $this->getUser()->setFlash('notice', $notice);
                                $this->redirect(array('sf_route' => 'ins_stage_edit', 'sf_subject' => $ins_stage));
                            }
                        } else {
                            $this->getUser()->setFlash('error', 'The item has not been saved due to some errors.', false);
                        }
                    } else {
                        $this->getUser()->setFlash('error', 'Le stage '. $stage .' est complet ! (maximum : '. $stage->getNbrPersonnesMax() .' personnes)', false);
                    }
                } else {
                    $this->getUser()->setFlash('error', 'Il y a déjà une inscription à ce nom ou à ce groupe', false);
                }
            }
        } else {
            // le code qui suit est la méthode initiale générée
            if ($form->isValid()) {
                $notice = $form->getObject()->isNew() ? 'The item was created successfully.' : 'The item was updated successfully.';
                $ins_stage = $form->save();
                $this->dispatcher->notify(new sfEvent($this, 'admin.save_object', array('object' => $ins_stage)));

                if ($request->hasParameter('_save_and_add')) {
                    $this->getUser()->setFlash('notice', $notice.' You can add another one below.');
                    $this->redirect('@ins_stage_new');
                } else {
                    $this->getUser()->setFlash('notice', $notice);
                    $this->redirect(array('sf_route' => 'ins_stage_edit', 'sf_subject' => $ins_stage));
                }
            } else {
                $this->getUser()->setFlash('error', 'The item has not been saved due to some errors.', false);
            }
        }
    }

    // teste si un contact simple est deja inscrit a ce stage
    private function contactInscrit($contactId, $stageId) {
        $inscriptions = 0;

        if (!is_null($contactId) && !is_null($stageId)) {
            if (!empty($contactId) && !empty($stageId)) {
                $inscriptions = InsStageTable::contactInscrit($contactId, $stageId);
            }
        }

        return $inscriptions;
    }

    // teste si un groupe est deja inscrit a ce stage
    private function groupeInscrit($groupeId, $stageId) {
        $inscriptions = 0;

        if (!is_null($groupeId) && !is_null($stageId)) {
            if (!empty($groupeId) && !empty($stageId)) {
                $inscriptions = InsStageTable::groupeInscrit($groupeId, $stageId);
            }
        }

        return $inscriptions;
    }

    // determine le nb d'inscriptions pour groupe || contact
    private function determinerNbIns($groupeId) {
        $nbInscriptions = 1;

        if(!is_null($groupeId) && !empty($groupeId)) {
            $groupe = Doctrine_Core::getTable('Groupe')->find($groupeId);
            $nbInscriptions = count($groupe->getMembres());
        }

        return $nbInscriptions;
    }

    // compter inscriptions
    private function compterInscription($nbInscriptions, $listeInscriptions) {
        $inscriptions = is_null($listeInscriptions) ? 0 : $listeInscriptions;

        foreach($inscriptions as $ins) {
            // compter les membres du groupe si inscription groupee
            if(!is_null($ins->getIdGroupe())) {
                $nbInscriptions += count($ins->getGroupe()->getMembres());
            }else {
                $nbInscriptions += 1;
            }
        }

        return $nbInscriptions;
    }

    // utile pour que les actions batch respecten le softDelete
    protected function executeBatchDelete(sfWebRequest $request) {
        $ids = $request->getParameter('ids');

        $records = Doctrine_Query::create()
                ->select()
                ->from('InsStage')
                ->whereIn('id', $ids)
                ->execute();

        $count = 0;
        foreach($records as $record) {
            $count += $record->delete();
        }

        if ($count >= count($ids)) {
            $this->getUser()->setFlash('notice', 'The selected items have been deleted successfully.');
        } else {
            $this->getUser()->setFlash('error', 'A problem occurs when deleting the selected items.');
        }

        $this->redirect('@ins_stage');
    }


}
